The rich complexity of quantum states and processes enables powerful new protocols for processing and communicating quantum information, as illustrated, for example, by Shor's factoring algorithm, quantum simulation. algorithms, and others. However, the same rich complexity of quantum processes that makes them useful also allows a large variety of errors to occur. Errors in a quantum computation arise from a variety of sources, including decoherence and imperfect control, where the latter can lead to coherent (unitary) errors. Fault-tolerant quantum computation can be performed in the presence of such errors provided they occur with at most some maximum threshold probability.